/******************************************************************************
    头文件
******************************************************************************/
#include "tic10024_reg.h"

/******************************************************************************
    文件内部使用的宏
******************************************************************************/

/******************************************************************************
    局部函数声明
******************************************************************************/

/******************************************************************************
    全局变量定义
******************************************************************************/
tic10024_status g_tic10024_status;    /** \brief  TIC10024状态数据结构体变量 */

/******************************************************************************
    局部变量定义
******************************************************************************/

/******************************************************************************
    局部函数实现
******************************************************************************/
/**
 * \brief 计算给定数据的奇偶校验位
 *
 * 计算给定32位无符号整数的奇偶校验位。奇偶校验位是根据二进制数据中1的个数是奇数还是偶数来确定的。
 *
 * \param data 要计算奇偶校验位的32位无符号整数
 * \return 返回计算得到的奇偶校验位（0或1）
 */
static uint32_t _parity_calculate(uint32_t data)
{
    uint32_t parity = 0;
    int32_t i = 0;

    for (i = 0; i < 32; i++)
    {
        parity ^= (data >> i) & 0x1;
    }

    parity &= 0x1;
    if (parity == 0)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

/******************************************************************************
    全局函数实现
******************************************************************************/

/**
 * \brief 读取TIC10024寄存器
 *
 * 该函数通过SPI接口读取TIC10024的寄存器值。
 *
 * \param reg_addr 要读取的寄存器地址
 *
 * \return 读取到的寄存器值
 */
uint32_t tic10024_reg_read(uint8_t reg_addr)
{
    uint32_t tx_data = (0U << 31) | (reg_addr << 25);
    tx_data |= _parity_calculate(tx_data);
    uint32_t rx_data = tic10024_spi_transfer(tx_data);

    g_tic10024_status.B = (rx_data & 0xFE000000) >> 25; /* 提取状态数据 */

    return ((rx_data >> 1) & 0x00FFFFFF); /* 返回内容数据部分 */
}

/**
 * \brief 向TIC10024寄存器写入数据
 *
 * 该函数通过SPI接口向TIC10024芯片写入寄存器数据。
 *
 * \param reg_addr 寄存器地址
 * \param data 要写入的数据
 */
void tic10024_reg_write(uint8_t reg_addr, uint32_t data)
{
    uint32_t tx_data = (1U << 31) | (reg_addr << 25) | ((data & 0x00FFFFFF) << 1);
    tx_data |= _parity_calculate(tx_data);
    uint32_t rx_data = tic10024_spi_transfer(tx_data);

    g_tic10024_status.B = (rx_data & 0xFE000000) >> 25; /* 提取状态数据 */
}
/* end of file */
